﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace EstadosMunicipios
{
    public partial class EstadosMunicipios : Form
    {
        protected XmlDocument xDoc = new XmlDocument();

        public EstadosMunicipios()
        {
            InitializeComponent();
        }

        private void EstadosMunicipios_Load(object sender, EventArgs e)
        {
            try
            {
                xDoc.Load(Application.StartupPath + "/EstadosMunicipios.xml");
                CarregarComboBox(cbEstados);
            }catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        public void CarregarComboBox(ComboBox cbx)
        {
            foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
                cbx.Items.Add(node["Nome"].InnerText);
        }

        private void cbEstados_SelectedIndexChanged(object sender, EventArgs e)
        {
            XmlNode node = xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex];

            if (node != null)
            {
                txtNomeE.Text = node["Nome"].InnerText;
                txtUF.Text = node["UF"].InnerText;
                txtRegiao.Text = node["Regiao"].InnerText;
                txtQtdM.Text = node["QtdMunicipios"].InnerText;

                cbMunicipio.Items.Clear();

                foreach (XmlNode no in node["Municipios"])
                {
                    cbMunicipio.Items.Add(no["Nome"].InnerText);
                }
            }
        }

        private void InserirEstado(int idEstado)
        {
            XmlElement estado = xDoc.CreateElement("Estado");
            // sub elementos
            XmlElement nome = xDoc.CreateElement("Nome");
            XmlElement uf = xDoc.CreateElement("UF");
            XmlElement regiao = xDoc.CreateElement("Regiao");
            XmlElement qtdMunic = xDoc.CreateElement("QtdMunicipios");
            XmlElement municipios = xDoc.CreateElement("Municipios");
            // atributo
            XmlAttribute estadoId = xDoc.CreateAttribute("EstadoID");
            estadoId.Value = Convert.ToString(cbEstados.Items.Count + 1);
            // atribuir valores
            XmlText nomeTxt = xDoc.CreateTextNode(txtNomeE.Text);
            XmlText ufTxt = xDoc.CreateTextNode(txtUF.Text);
            XmlText regiaoTxt = xDoc.CreateTextNode(txtRegiao.Text);
            XmlText qtdMTxt = xDoc.CreateTextNode(txtQtdM.Text);

            estado.Attributes.Append(estadoId);
            estado.AppendChild(nome);
            estado.AppendChild(uf);
            estado.AppendChild(regiao);
            estado.AppendChild(qtdMunic);
            estado.AppendChild(municipios);

            nome.AppendChild(nomeTxt);
            uf.AppendChild(ufTxt);
            regiao.AppendChild(regiaoTxt);
            qtdMunic.AppendChild(qtdMTxt);

            xDoc.DocumentElement.AppendChild(estado);

            gravarDocumento();

            LimparForm();
        }

        private void inseriMunicipio(XmlNode municipios)
        {
            XmlElement municipio = xDoc.CreateElement("Municipio");
            // sub elementos
            XmlElement nome = xDoc.CreateElement("Nome");
            XmlElement pop = xDoc.CreateElement("Populacao");
            XmlElement area = xDoc.CreateElement("Area");
            XmlElement clima = xDoc.CreateElement("Clima");
            XmlElement fuso = xDoc.CreateElement("FusoHorario");

            XmlAttribute municipioId = xDoc.CreateAttribute("MunicipioID");
            municipioId.Value = Convert.ToString(cbMunicipio.Items.Count + 1);

            XmlText nomeTxt = xDoc.CreateTextNode(txtNomeM.Text);
            XmlText popTxt = xDoc.CreateTextNode(txtPop.Text);
            XmlText areaTxt = xDoc.CreateTextNode(txtArea.Text);
            XmlText climaTxt = xDoc.CreateTextNode(txtClima.Text);
            XmlText fusoTxt = xDoc.CreateTextNode(txtFuso.Text);

            municipio.Attributes.Append(municipioId);
            municipio.AppendChild(nome);
            municipio.AppendChild(pop);
            municipio.AppendChild(area);
            municipio.AppendChild(clima);
            municipio.AppendChild(fuso);

            nome.AppendChild(nomeTxt);
            pop.AppendChild(popTxt);
            area.AppendChild(areaTxt);
            clima.AppendChild(climaTxt);
            fuso.AppendChild(fusoTxt);

            municipios.AppendChild(municipio);

            gravarDocumento();

            LimparForm();
        }

        private bool validaEstados()
        {
            if (txtNomeE.Text.Length > 0 && txtUF.Text.Length > 0 && txtRegiao.Text.Length > 0 && txtQtdM.Text.Length > 0)
                return true;

            return false;
        }

        private bool validaMunicipio()
        {
            if (txtNomeM.Text.Length > 0 && txtPop.Text.Length > 0 && txtClima.Text.Length > 0 && txtFuso.Text.Length > 0 && txtArea.Text.Length > 0)
                return true;

            return false;
        }

        private void LimparForm()
        {
            txtNomeE.Text = "";
            txtUF.Text = "";
            txtRegiao.Text = "";
            txtQtdM.Text = "";

            txtNomeM.Text = "";
            txtPop.Text = "";
            txtArea.Text = "";
            txtClima.Text = "";
            txtFuso.Text = "";

            cbEstados.Items.Clear();
            cbMunicipio.Items.Clear();
            CarregarComboBox(cbEstados);
            cbMunicipio.Text = "";
            cbEstados.Text = "";
            //LimparForm();
            /*
            cbEstados.SelectedIndex = 1;
            cbEstados_SelectedIndexChanged(null, null);
            cbMunicipio.SelectedIndex = cbMunicipio.Items.Count - 1;
            cbMunicipio_SelectedIndexChanged(null, null);
             */ 
            ////Carregar a Combo com os Parametros
            //foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
            //{
            //    //adicionar os Empregados a COMBO
            //    comboBox1.Items.Add(node.Attributes["ProdutoID"].Value);
            //}
        }

        private void gravarDocumento()
        {
            //Gravar Documento
            try
            {
                xDoc.Save(Application.StartupPath + "/EstadosMunicipios.xml");
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
        }

        private void cbMunicipio_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex] != null)
            {
                XmlNode nMunicipios = xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex].ChildNodes.Item(4);
                if (nMunicipios.ChildNodes.Count > 0)
                {
                    XmlNode nMunic = nMunicipios.ChildNodes[cbMunicipio.SelectedIndex];

                    txtNomeM.Text = nMunic["Nome"].InnerText;
                    txtPop.Text = nMunic["Populacao"].InnerText;
                    txtArea.Text = nMunic["Area"].InnerText;
                    txtClima.Text = nMunic["Clima"].InnerText;
                    txtFuso.Text = nMunic["FusoHorario"].InnerText;
                }
            }
        }

        private void btnInserir_Click(object sender, EventArgs e)
        { 
            /*
            string nomeEstado = "";
           
            if (xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex] != null)
                nomeEstado = xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex]["Nome"].InnerText;
            */
            if(cbEstados.SelectedItem == null && validaEstados())
                InserirEstado(cbEstados.SelectedIndex);

            if (xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex] != null && validaMunicipio())
                inseriMunicipio(xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex].ChildNodes.Item(4));
        }

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            cbEstados.SelectedIndex = -1;
            cbMunicipio.SelectedIndex = -1;
            cbMunicipio.Items.Clear();

            cbEstados.Text = "";
            cbMunicipio.Text = "";

            txtNomeE.Text = "";
            txtUF.Text = "";
            txtRegiao.Text = "";
            txtQtdM.Text = "";

            txtNomeM.Text = "";
            txtPop.Text = "";
            txtArea.Text = "";
            txtClima.Text = "";
            txtFuso.Text = "";

            rdExcluirEstado.Checked = false;
            rdExcluirMunicipio.Checked = false;
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            
            if (rdExcluirEstado.Checked && validaEstados())
            {
                excluirEstado(xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex]);
                return;
            }

            if (rdExcluirMunicipio.Checked && validaMunicipio())
            {
                excluirMunicipio(xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex].ChildNodes.Item(4).ChildNodes[cbMunicipio.SelectedIndex]);
                return;
            }

            MessageBox.Show("Selecione o item que deseja excluir.");
        }

        private void excluirEstado(XmlNode xmlNode)
        {
            XmlNode parent = xmlNode.ParentNode;
            parent.RemoveChild(xmlNode);
            gravarDocumento();
            LimparForm();
        }

        private void excluirMunicipio(XmlNode xmlNode)
        {
            XmlNode parent = xmlNode.ParentNode;
            parent.RemoveChild(xmlNode);
            gravarDocumento();
            LimparForm();
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            if (validaMunicipio())
                alterarMunicipio(xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex].ChildNodes.Item(4).ChildNodes[cbMunicipio.SelectedIndex]);

            if (validaEstados())
                alterarEstado(xDoc.DocumentElement.ChildNodes[cbEstados.SelectedIndex]);
        }

        private void alterarEstado(XmlNode xmlNode)
        {
            try
            {
                xmlNode.ChildNodes[0].InnerText = txtNomeE.Text;
                xmlNode.ChildNodes[1].InnerText = txtUF.Text;
                xmlNode.ChildNodes[2].InnerText = txtRegiao.Text;
                xmlNode.ChildNodes[3].InnerText = txtQtdM.Text;


                gravarDocumento();
                LimparForm();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            

        }

        private void alterarMunicipio(XmlNode xmlNode)
        {
            try
            {
                xmlNode.ChildNodes[0].InnerText = txtNomeM.Text;
                xmlNode.ChildNodes[1].InnerText = txtPop.Text;
                xmlNode.ChildNodes[2].InnerText = txtArea.Text;
                xmlNode.ChildNodes[3].InnerText = txtClima.Text;
                xmlNode.ChildNodes[4].InnerText = txtFuso.Text;

                gravarDocumento();
                LimparForm();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
    }
}